package org.dicr.event;

import java.util.*;

/***********************************************************************************************************************
 * @author Igor A Tarasov me@dicr.dn.ua
 * @version 021210
 **********************************************************************************************************************/
public class ProgramEventMulticaster {
	protected Vector<ProgramListener> listeners = new Vector<ProgramListener>();

	/*******************************************************************************************************************
     * Конструктор
     ******************************************************************************************************************/
	public ProgramEventMulticaster() {
		super();
	}

	/*******************************************************************************************************************
     * Добавить слушателя программных событий
     ******************************************************************************************************************/
	public synchronized void addProgramListener(ProgramListener l) {
		if (l != null && !this.listeners.contains(l)) {
			this.listeners.add(l);
		}
	}

	/*******************************************************************************************************************
     * Удалять слушателя программных событий
     ******************************************************************************************************************/
	public synchronized void removeProgramListener(ProgramListener l) {
		this.listeners.remove(l);
	}

	/*******************************************************************************************************************
     * Проверяет наличие слушателя
     ******************************************************************************************************************/
	public synchronized boolean hasProgramListener(ProgramListener l) {
		if (l == null) {
			DicrExceptionHandler.handleException(new Exception("null параметр l"), this);
			return false;
		}
		return this.listeners.contains(l);
	}

	/*******************************************************************************************************************
     * Оповещает слушателей о событии
     ******************************************************************************************************************/
	public synchronized void fireProgramEvent(ProgramEvent e) {
		if (e == null) { throw new IllegalArgumentException("null параметр e"); }
		ProgramListener[] lls = this.listeners.toArray(new ProgramListener[0]);
		for (int i = 0; i < lls.length; i++) {
			try {
				ProgramListener l = lls[i];
				if (l == null) {
					continue;
				}
				l.eventPerformed(e);
			} catch (Throwable ex) {
				DicrExceptionHandler.handleException(ex, this);
			}
		}
	}
}
